//package com.ruoyi.eqmonitor.utils;
//
//import cn.hutool.core.util.ArrayUtil;
//import cn.hutool.core.util.NumberUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.http.HttpUtil;
//import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONUtil;
//import com.vividsolutions.jts.geom.*;
//import com.vividsolutions.jts.io.ParseException;
//import com.vividsolutions.jts.io.WKTReader;
//import lombok.extern.slf4j.Slf4j;
//import org.geotools.geometry.jts.GeometryBuilder;
//import org.geotools.geometry.jts.JTS;
//import org.geotools.referencing.CRS;
//import org.opengis.referencing.FactoryException;
//import org.opengis.referencing.crs.CoordinateReferenceSystem;
//import org.opengis.referencing.operation.MathTransform;
//import org.opengis.referencing.operation.TransformException;
//
//import lombok.extern.slf4j.Slf4j;
//
///**
// * 几何图形工具类
// */
//@Slf4j
//public class GeometryUtil {
//    /** 高德AK 高德开放平台申请 */
//    public static final String GD_AK = "";
//
//    /** 高德逆地理编码url */
//    public static final String GD_ADDRESS_URL = "https://restaLocationConvertUtil.pi.amap.com/v3/geocode/regeo?output=json&location={},{}&key="+ GD_AK +"&radius=500&extensions=all";
//
//    /**
//     * 判断点与面相交 加入半径容错范围 半径(米)
//     */
//    public static boolean judgeIntersectByWkt(String polygonStr, double longitude, double latitude, String radius){
//        try {
//            double radiusNumber = 0.0005;
//            // 将传入的半径单位转换为千米
//            if(NumberUtil.isNumber(radius)) {
//                radiusNumber = NumberUtil.parseNumber(radius).doubleValue() / 1000;
//            }
//            GeometryFactory geometryFactory = new GeometryFactory();
//            Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude) );
//            GeometryBuilder geometryBuilder = new GeometryBuilder();
//            Polygon circle = geometryBuilder.circle(point.getX(), point.getY(), radiusNumber, 32);
//            Geometry geometry = GeometryConvertUtil.wkt2Geometry(polygonStr);
//            if (geometry == null){
//                log.error("wkt非法: {}", polygonStr);
//                return false;
//            }
//            // 解析围栏多边形
//            return geometry.intersects(circle);
//        } catch (Exception e) {
//            log.error("解析空间数据错误: ", e);
//            return false;
//        }
//    }
//
//    /**
//     * 判断点与面相交 加入半径容错范围 半径(米)
//     */
//    public static boolean judgeIntersectByGeoJson(String polygonStr, double longitude, double latitude, String radius){
//        try {
//            double radiusNumber = 0.0005;
//            // 将传入的半径单位转换为千米
//            if(NumberUtil.isNumber(radius)) {
//                radiusNumber = NumberUtil.parseNumber(radius).doubleValue() / 1000;
//            }
//            GeometryFactory geometryFactory = new GeometryFactory();
//            Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude) );
//            GeometryBuilder geometryBuilder = new GeometryBuilder();
//            Polygon circle = geometryBuilder.circle(point.getX(), point.getY(), radiusNumber, 32);
//            Geometry geometry = GeometryConvertUtil.geoJson2Geometry(polygonStr);
//            if (geometry == null) {
//                log.error("geoJson非法: {}", polygonStr);
//                return false;
//            }
//            // 解析围栏多边形
//            return geometry.intersects(circle);
//        } catch (Exception e) {
//            log.error("解析空间数据错误: ", e);
//            return false;
//        }
//    }
//
//    /**
//     * 判断点与面相交
//     */
//    public static boolean judgeIntersectByGeoJson(String polygonStr, double longitude, double latitude){
//        return judgeIntersectByGeoJson(polygonStr, longitude, latitude, "0");
//    }
//
//    /**
//     * 判断点与面相交
//     */
//    public static boolean judgeIntersectByWkt(String polygonStr, double longitude, double latitude){
//        return judgeIntersectByWkt(polygonStr, longitude, latitude, "0");
//    }
//
//    /**
//     * 设备回传经纬度的相交判断(不含小数)
//     */
//    public static boolean judgeIntersectByGeoJson(String polygonStr, String longitude, String latitude){
//        double lon = NumberUtil.div(longitude, "1000000").doubleValue();
//        double lat  = NumberUtil.div(latitude, "1000000").doubleValue();
//        return judgeIntersectByGeoJson(polygonStr, lon, lat);
//    }
//
//    /**
//     * 设备回传经纬度的相交判断(不含小数)
//     */
//    public static boolean judgeIntersectByWkt(String polygonStr, String longitude, String latitude){
//        double lon = NumberUtil.div(longitude, "1000000").doubleValue();
//        double lat  = NumberUtil.div(latitude, "1000000").doubleValue();
//        return judgeIntersectByWkt(polygonStr, lon, lat);
//    }
//
//    /**
//     * 根据wkt计算多边形面积
//     * @param wkt 待计算wkt
//     * @return 面积数据
//     */
//    public static double getAreaByWkt(String wkt){
//        Geometry geometry ;
//        WKTReader reader = new WKTReader();
//        try {
//            geometry = reader.read(wkt);
//        } catch (ParseException e) {
//            geometry = null;
//            e.printStackTrace();
//        }
//        return getArea(geometry);
//    }
//
//    /**
//     * 根据wkt计算多边形周长
//     * @param wkt 待计算wkt
//     * @return 面积数据
//     */
//    public static double getLengthByWkt(String wkt){
//        Geometry geometry ;
//        WKTReader reader = new WKTReader();
//        try {
//            geometry = reader.read(wkt);
//        } catch (ParseException e) {
//            geometry = null;
//            e.printStackTrace();
//        }
//        return getLength(geometry);
//    }
//
//    /**
//     * 根据多边形类型计算出多边形面积，单位（平方公里）(84,4326)
//     * @param geometry 多边形对象
//     * @return 面积
//     */
//    public static double getArea(Geometry geometry){
//        CoordinateReferenceSystem source = null;
//        try {
//            source = CRS.decode("CRS:84");
//        } catch (FactoryException e) {
//            e.printStackTrace();
//        }
//        CoordinateReferenceSystem target = null;
//        try {
//            target = CRS.decode("EPSG:3857");
//        } catch (FactoryException e) {
//            e.printStackTrace();
//        }
//        MathTransform transform = null;
//        try {
//            transform = CRS.findMathTransform(source, target, true);
//        } catch (FactoryException e) {
//            e.printStackTrace();
//        }
//        Geometry transform1 = null;
//        try {
//            transform1 = JTS.transform(geometry, transform);
//        } catch (TransformException e) {
//            e.printStackTrace();
//        }
//        return NumberUtil.div(transform1 != null ? transform1.getArea() : 0.0, 1000000, 2);
//    }
//
//    /**
//     * 根据多边形类型计算出多边形面积，单位（平方公里）(84,4326)
//     * @param geometry 多边形对象
//     * @return 面积
//     */
//    public static double getLength(Geometry geometry){
//        CoordinateReferenceSystem source = null;
//        try {
//            source = CRS.decode("CRS:84");
//        } catch (FactoryException e) {
//            e.printStackTrace();
//        }
//        CoordinateReferenceSystem target = null;
//        try {
//            target = CRS.decode("EPSG:3857");
//        } catch (FactoryException e) {
//            e.printStackTrace();
//        }
//        MathTransform transform = null;
//        try {
//            transform = CRS.findMathTransform(source, target, true);
//        } catch (FactoryException e) {
//            e.printStackTrace();
//        }
//        Geometry transform1 = null;
//        try {
//            transform1 = JTS.transform(geometry, transform);
//        } catch (TransformException e) {
//            e.printStackTrace();
//        }
//        return transform1 != null ? transform1.getLength() : 0.0;
//    }
//
//    /** 获取两点之间的距离 [经度,维度] [经度, 维度] 是否为墨卡托 返回单位[米] */
//    public static double getDistance(double[] startPoint, double[] endPoint, boolean isWGS84) {
//        double[] webStartPoint, webEndPoint;
//        if (isWGS84) {
//            webStartPoint = LocationConvertUtil.lngLat2Mercator(startPoint[0], startPoint[1]);
//            webEndPoint = LocationConvertUtil.lngLat2Mercator(endPoint[0],endPoint[1]);
//        } else {
//            webStartPoint = startPoint;
//            webEndPoint = endPoint;
//        }
//        return Math.sqrt(Math.pow((webEndPoint[0] - webStartPoint[0]), 2) + Math.pow((webEndPoint[1] - webStartPoint[1]), 2));
//    }
//
//    /**
//     * 通过经纬度获取距离(单位：米)
//     * @param lat1 纬度1
//     * @param lng1 经度1
//     * @param lat2 纬度2
//     * @param lng2 经度2
//     * @return 距离
//     */
//    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
//        double radLat1 = LocationConvertUtil.rad(lat1);
//        double radLat2 = LocationConvertUtil.rad(lat2);
//        double a = radLat1 - radLat2;
//        double b = LocationConvertUtil.rad(lng1) - LocationConvertUtil.rad(lng2);
//        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
//                + Math.cos(radLat1) * Math.cos(radLat2)
//                * Math.pow(Math.sin(b / 2), 2)));
//        s = s * LocationConvertUtil.EARTH_RADIUS;
//        s = Math.round(s * 10000d) / 10000d;
//        s = s * 1000;
//        return s;
//    }
//
//    /**
//     * 根据经纬度返回位置
//     * @param point 坐标
//     * @param isWGS84 是否为墨卡托
//     * @return 位置
//     */
//    public static String getAddressByLocation(double[] point, boolean isWGS84) {
//        if (ArrayUtil.isEmpty(point) || point.length != 2) {
//            log.error("逆地理编码请求失败, 入参坐标系格式不正确");
//            return StrUtil.EMPTY;
//        }
//        JSONObject resObj = null;
//        try {
//            double[] gcj02Point;
//            if (isWGS84) {
//                gcj02Point = LocationConvertUtil.wgs84_To_Gcj02(point[0], point[1]);
//                if (ArrayUtil.isEmpty(gcj02Point) || gcj02Point.length != 2) {
//                    log.error("逆地理编码请求失败, 坐标系格式不正确");
//                    return StrUtil.EMPTY;
//                }
//            } else {
//                gcj02Point = point;
//            }
//            String url = StrUtil.format(GD_ADDRESS_URL, gcj02Point[0], gcj02Point[1]);
//            String result = HttpUtil.get(url, 1000 * 60);
//            resObj = JSONUtil.parseObj(result);
//        } catch (Exception e) {
//            log.error("请求高德逆地理编码失败:", e);
//            return StrUtil.EMPTY;
//        }
//        if (resObj.getInt("status") == 1) {
//            JSONObject regeocode = resObj.getJSONObject("regeocode");
//            if (regeocode != null) {
//                return regeocode.getStr("formatted_address");
//            }
//            return StrUtil.EMPTY;
//        }
//        return StrUtil.EMPTY;
//
//    }
//}
